﻿using System.Collections.Generic;
using NHibernate;
using NHibernate.Criterion;
using Neturion.Dados;
using Neturion.IRepositorios;

namespace Neturion.Repositorios
{
    public class RepositorioEmail : IRepositorioEmail
    {
        public Email Inserir(Email email)
        {
            email.FimVigencia = email.FimVigencia.HasValue
                                    ? email.FimVigencia.GetValueOrDefault().Date
                                    : email.FimVigencia;
            email.InicioVigencia = email.InicioVigencia.HasValue
                                        ? email.InicioVigencia.GetValueOrDefault().Date
                                        : email.InicioVigencia;

            GerenciadorBDConfigs.Instance.SessaoAtual().Save(email);
            return email;
        }

        public Email Atualizar(Email email)
        {
            Email tmpEmail = ObterPorId(email.EmailId);
            // Atribuicao dos valores do objeto da memoria para o objeto obtido no banco de dados
            tmpEmail.Codigo = email.Codigo;
            tmpEmail.Descricao = email.Descricao;
            tmpEmail.FimVigencia = email.FimVigencia.HasValue
                                    ? email.FimVigencia.GetValueOrDefault().Date
                                    : email.FimVigencia;
            tmpEmail.InicioVigencia = email.InicioVigencia.HasValue
                                        ? email.InicioVigencia.GetValueOrDefault().Date
                                        : email.InicioVigencia;
            tmpEmail.NeturionLog = email.NeturionLog;
            tmpEmail.Observacao = email.Observacao;
            tmpEmail.Pessoa = email.Pessoa;

            GerenciadorBDConfigs.Instance.SessaoAtual().Merge(tmpEmail);
            return tmpEmail;
        }

        public void Excluir(Email email)
        {
            GerenciadorBDConfigs.Instance.SessaoAtual().Delete(email);
        }

        public IList<Email> ObterTodos()
        {
            ICriteria criteria = GerenciadorBDConfigs.Instance.SessaoAtual().CreateCriteria(typeof(Email));
            return criteria.List<Email>() as List<Email>;
        }

        public Email ObterPorId(int id)
        {
            return GerenciadorBDConfigs.Instance.SessaoAtual().Get<Email>(id);
        }

        public Email ObterPorCodigo(string codigo)
        {
            ICriteria criteria = GerenciadorBDConfigs.Instance.SessaoAtual().CreateCriteria(typeof (Email))
                .Add(Restrictions.Eq("Codigo", codigo));
            return criteria.UniqueResult<Email>();
        }

        public IList<Email> ObterPorPessoa(Pessoa pessoa)
        {
            ICriteria criteria = GerenciadorBDConfigs.Instance.SessaoAtual().CreateCriteria(typeof (Email))
                .Add(Restrictions.Eq("Pessoa", pessoa));
            return criteria.List<Email>() as List<Email>;
        }

        public int ObterUltimoIdCodigoInteiro()
        {
            string[] literal = new string[] 
                {"a","b","c","d","e","f","g","h","i","j"
                ,"l","m","n","o","p","q","r","s","t","u","v","x","z","y"
                ,"w"};

            ICriteria criteria = GerenciadorBDConfigs.Instance.SessaoAtual().CreateCriteria(typeof(Email)).SetMaxResults(1);

            for (int i = 0; i <= literal.Length - 1; i++)
            {
                criteria.Add(Restrictions.Not(Restrictions.Like("Codigo", literal[i], MatchMode.Anywhere)));
            }

            criteria.AddOrder(Order.Desc("EmailId"));


            Email email = criteria.UniqueResult<Email>();
            int ultimoCodigo = email != null ? email.EmailId : 0;

            return ultimoCodigo;
        }
    }
}